<?php

namespace app\api\controller;

use app\common\controller\Api;
use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Green\Green as GreenModel;
use AlibabaCloud\Client\Exception\ClientException;
use AlibabaCloud\Client\Exception\ServerException;
use think\Exception;
use think\Db;
/**
 * 验证
 */
class Green extends Api
{
    protected $noNeedLogin = '*';
    protected $noNeedRight = '*';
    /* protected $AccessKey_ID = 'LTAI5tPPmS5YzTtWP7aXBxLf';
    protected $AccessKey_Secret = 'zekiAFitaHACQm6JzMMimh23JlZFoN'; */
    protected $AccessKey_ID = 'LTAI5tHqBiKuuEXzj5Na4D7t';
    protected $AccessKey_Secret = 'hqZlkoMROlQMCqSAwDEyGJ1Y1C70Cs';
    //同步检测图片
    public function examine_img()
    {
        //$this->success('操作成功');
        $data = $this->request->request();
        try {
            /**
             * 注意：此处实例化的client尽可能重复使用，提升检测性能。避免重复建立连接。
             * 常见获取环境变量方式：
             * 获取RAM用户AccessKey ID：getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
             * 获取RAM用户AccessKey Secret：getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
             */
            AlibabaCloud::accessKeyClient($this->AccessKey_ID, $this->AccessKey_Secret)
                ->timeout(10) // 超时10秒，使用该客户端且没有单独设置的请求都使用此设置。
                ->connectTimeout(3) // 连接超时3秒，当小于1秒时，则自动转换为毫秒，使用该客户端且没有单独设置的请求都使用此设置。
                ->regionId('cn-shenzhen')
                ->asDefaultClient();
            if(!empty($data['imgs'])){  //检测图片
                $imgs = explode(',',$data['imgs']);
                $task = [];
                foreach ($imgs as $v) {
                    if(strstr($v, 'mp4')){
                        $video_url[] = $v;
                    }else{
                        $task[] = [
                            'dataId' => time().rand(1,9999999),
                            'url' =>$v
                        ];
                    }
                }
                /* 设置待检测的图片，一张图片对应一个检测任务。
                * 多张图片同时检测时，处理时间由最后一张处理完的图片决定。
                * 通常情况下批量检测的平均响应时间比单张检测要长。一次批量提交的图片数越多，响应时间被拉长的概率越高。
                * 代码中以单张图片检测作为示例，如果需要批量检测多张图片，请自行构建多个检测任务。
                * OCR检测按照实际检测的图片张数*检测的卡证类型单价计费。
                */
                $response = GreenModel::v20180509()->imageSyncScan()
                    ->timeout(10) // 超时10秒，request超时设置，仅对当前请求有效。
                    ->connectTimeout(3) // 连接超时3秒，当小于1秒时，则自动转换为毫秒，request超时设置，仅对当前请求有效。
                    ->body(json_encode(array('tasks' => $task, 'scenes' => ['porn','terrorism','ad','live'], 'bizType' => 'default')))
                    ->request();
    
                if (200 == $response->code) {
                    $taskResults = $response->data;
                    foreach ($taskResults as $taskResult) {
                        if (200 == $taskResult->code) {
                            $sceneResults = $taskResult->results;
                            foreach ($sceneResults as $sceneResult) {
                                $scene = $sceneResult->scene;
                                $suggestion = $sceneResult->suggestion;
                                // 根据scene和suggestion做相关的处理。
                                if($suggestion != 'pass'){
                                    $this->error('存在违规');
                                }
                            }
                        } else {
                            $this->error('操作失败');
                        }
                    }
                } else {
                    $this->error('操作失败');
                }
            }

            if(!empty($data['video_url'])){  //检测视频
                $video_url[] = $data['video_url'];
            }

            if(!empty($video_url)){  //检测视频
                foreach ($video_url as $v) {
                    $task[] = [
                        'frames' => 
                            [
                                ['offset' => '0', 'url' => $v],
                                ['offset' => '1', 'url' => $v],
                                ['offset' => '2', 'url' => $v]
                            ]
                    ];
                }
                // scenes：检测场景，支持指定多个场景。
                $response = GreenModel::v20180509()->videoSyncScan()
                    ->timeout(10) // 超时10秒，request超时设置，仅对当前请求有效。
                    ->connectTimeout(3) // 连接超时3秒，当单位小于1，则自动转换为毫秒，request超时设置，仅对当前请求有效
                    ->body(json_encode(array('tasks' => $task,
                        'scenes' => ['porn','terrorism','ad','live'], 
                        'bizType' => 'default')))
                    ->request();
                if (200 == $response->code) {
                    $taskResults = $response->data;
                    foreach ($taskResults as $taskResult) {
                        if (200 == $taskResult->code) {
                            $sceneResults = $taskResult->results;
                            foreach ($sceneResults as $sceneResult) {
                                $scene = $sceneResult->scene;
                                $suggestion = $sceneResult->suggestion;
                                // 根据scene和suggestion做相关的处理。
                                if($suggestion != 'pass'){
                                    $this->error('存在违规');
                                }
                            }
                        } else {
                            $this->error('操作失败');
                        }

                    }
                } else {
                    $this->error('操作失败');
                }
            }
           
            if(!empty($data['title'])){  //检测文本
               
                $task1 = ['dataId' =>  time().rand(1,9999999),
                'content' => $data['title']];
                /**
                 * 文本垃圾检测：antispam。
                 **/
                $response = GreenModel::v20180509()->textScan()
                    ->timeout(10) // 超时10秒，request超时设置，仅对当前请求有效。
                    ->connectTimeout(3) // 连接超时3秒，当单位小于1，则自动转换为毫秒，request超时设置，仅对当前请求有效。
                    ->body(json_encode(array('tasks' => array($task1), 'scenes' => array('antispam'), 'bizType' => 'default')))
                    ->request();
                if (200 == $response->code) {
                    $taskResults = $response->data;
                    foreach ($taskResults as $taskResult) {
                        if (200 == $taskResult->code) {
                            $sceneResults = $taskResult->results;
                            foreach ($sceneResults as $sceneResult) {
                                $scene = $sceneResult->scene;
                                $suggestion = $sceneResult->suggestion;
                                // 根据scene和suggestion做相关的处理。
                                if($suggestion != 'pass'){

                                    $details = $sceneResult->details;
                                    foreach ($details as $detail) {
                                        $contexts = $detail->contexts;
                                        foreach ($contexts as $context) {
                                            $this->error('存在违规词：'.$context->context.'。请更改后重新提交！');
                                        }
                                    }
                                    $this->error('存在违规');
                                }
                            }
                        } else {
                            $this->error('操作失败');
                        }
                    }
                    /* foreach ($taskResults as $taskResult) {
                        if (200 == $taskResult->code) {
                            $sceneResults = $taskResult->results;
                            foreach ($sceneResults as $sceneResult) {
                                $scene = $sceneResult->scene;
                                $suggestion = $sceneResult->suggestion;
                                // 根据scene和suggestion做相关的处理。
                                if($suggestion != 'pass'){
                                    $this->error('存在违规');
                                }
                            }
                        } else {
                            $this->error('操作失败');
                        }

                    } */
                } else {
                    $this->error('操作失败');
                }
            }
            
            $this->success('操作成功');
        } catch (Exception $exception) {
            echo $exception->getMessage() . PHP_EOL;
        }
    }
}
